/**
 * ControladoraLogin.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.negocios;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import adsec.datos.AdministradorConexion;
import adsec.entidades.InformacionLogin;
import adsec.presentacion.LiceoEscazuApp;


public class ControladoraLogin {

    private ControladoraUsuario controladoraUsuario;
    private AdministradorConexion adminConexion;
    private FileInputStream flujoEntradaPequenio;
	private ObjectInputStream flujoEntradaGrande;
	private FileOutputStream flujoSalidaPequenio;
	private ObjectOutputStream flujoSalidaGrande;
    private final String ruta = LiceoEscazuApp.getApplication().getContext().getLocalStorage().getDirectory().toString() + "/conf";
    private final String algoritmo = "DES";
    private InformacionLogin infoLogin;

    /*private final byte [] bytesLlave = {(byte)0x97, (byte)0x13, (byte)0x31,
                (byte)0x79, (byte)0x3, (byte)0x7, (byte)0x47, (byte)0x67};*/
    private final byte [] bytesLlave = {(byte)0x13, (byte)0x03, (byte)0x02,
                (byte)0x17, (byte)0x05, (byte)0x7, (byte)0x05, (byte)0x11};

    public ControladoraLogin(){
        this.controladoraUsuario = new ControladoraUsuario();
        this.adminConexion = AdministradorConexion.getInstancia();
        infoLogin = new InformacionLogin();
    }

    public int ingresarUsuario(String usuario, String password, String servidorBD,
            String puerto, String usuarioBD, String passwordBD, String nombreBD){

        this.adminConexion.setUrlBD(servidorBD, puerto, nombreBD);
        this.adminConexion.setUsuario(usuarioBD);
        this.adminConexion.setPassword(passwordBD);
        int resultado = this.controladoraUsuario.loguearUsuario(usuario, password);
        return resultado;
    }//fin de ingresarUsuario

    public void guardarDatosConexion(String usuario, String password, String servidorBD,
            String puerto, String usuarioBD, String passwordBD, String nombreBD, boolean guardarPasswd){

        try{
            infoLogin = new InformacionLogin();
            infoLogin.setUsuario(usuario);
            byte [] passEncriptado = this.encriptar(password);
            infoLogin.setPassword(passEncriptado);
            infoLogin.setServidorBD(servidorBD);
            infoLogin.setPuerto(puerto);
            infoLogin.setUsuarioBD(usuarioBD);
			infoLogin.setNombreBD(nombreBD);
            infoLogin.setGuardarPasswd(guardarPasswd);
            byte [] passBDEncriptado = this.encriptar(passwordBD);
            infoLogin.setPasswordBD(passBDEncriptado);
            flujoSalidaPequenio = new FileOutputStream(this.ruta);
            flujoSalidaGrande = new ObjectOutputStream(flujoSalidaPequenio);
            flujoSalidaGrande.writeObject(infoLogin);
            flujoSalidaGrande.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }//fin de guardarDatosConexion

    public void leerDatosConfiguracion(){
        try{
            flujoEntradaPequenio = new FileInputStream(this.ruta);
            flujoEntradaGrande = new ObjectInputStream(flujoEntradaPequenio);
            infoLogin = (InformacionLogin) flujoEntradaGrande.readObject();
        }catch(IOException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }//fin de leerDatosConfiguracion

    public void cerrarArchivoLectura(){
        if(this.flujoEntradaGrande != null){
            try{
                this.flujoEntradaGrande.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }//fin de if
    }//fin de cerrarArchivoLectura

    public byte [] encriptar(String frase){
        byte [] datosEncriptados = null;
        try{
            
            SecretKeyFactory fabricaLlave = SecretKeyFactory.getInstance(this.algoritmo);
            SecretKey llave = fabricaLlave.generateSecret(new DESKeySpec(this.bytesLlave, 0));
            Cipher encriptador = Cipher.getInstance(this.algoritmo);
            encriptador.init(Cipher.ENCRYPT_MODE, llave);
            byte [] datos = frase.getBytes();
            datosEncriptados = encriptador.doFinal(datos);
        }catch(NoSuchAlgorithmException e){
            System.err.println("El algoritmo de encriptación " + this.algoritmo + " no existe en el sistema");
            e.printStackTrace();
        }catch(NoSuchPaddingException e){
            e.printStackTrace();
        }catch(Exception e){
            System.err.println("La encriptación falló");
            e.printStackTrace();
        }
        return datosEncriptados;
    }//fin de encriptar

    public String desencriptar(byte [] bytesEncriptados){
        String resultado = null;
        try{
            SecretKeyFactory fabricaLlave = SecretKeyFactory.getInstance(this.algoritmo);
            SecretKey llave = fabricaLlave.generateSecret(new DESKeySpec(this.bytesLlave, 0));
            Cipher desencriptador = Cipher.getInstance(this.algoritmo);
            desencriptador.init(Cipher.DECRYPT_MODE, llave);
            byte [] datosDesencriptados = desencriptador.doFinal(bytesEncriptados);
            resultado = new String(datosDesencriptados);
        }catch(NoSuchAlgorithmException e){
            System.err.println("El algoritmo de encriptación " + this.algoritmo + " no existe en el sistema");
            e.printStackTrace();
        }catch(NoSuchPaddingException e){
            e.printStackTrace();
        }catch(Exception e){
            System.err.println("La desencriptación falló");
            e.printStackTrace();
        }
        return resultado;
    }//fin de desencriptar

    public String desencriptar(String fraseEncriptada){
        String resultado = null;
        try{
            
            SecretKeyFactory fabricaLlave = SecretKeyFactory.getInstance(this.algoritmo);
            SecretKey llave = fabricaLlave.generateSecret(new DESKeySpec(this.bytesLlave, 0));
            Cipher desencriptador = Cipher.getInstance(this.algoritmo);
            desencriptador.init(Cipher.DECRYPT_MODE, llave);
            byte [] datosDesencriptados = desencriptador.doFinal(fraseEncriptada.getBytes());
            resultado = new String(datosDesencriptados);
        }catch(NoSuchAlgorithmException e){
            System.err.println("El algoritmo de encriptación " + this.algoritmo + " no existe en el sistema");
            e.printStackTrace();
        }catch(NoSuchPaddingException e){
            e.printStackTrace();
        }catch(Exception e){
            System.err.println("La desencriptación falló");
            e.printStackTrace();
        }
        return resultado;
    }//fin de desencriptar

    /**
     * @return the usuario
     */
    public String getUsuario() {
        return this.infoLogin.getUsuario();
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return this.desencriptar(infoLogin.getPassword());
    }

    /**
     * @return the servidorBD
     */
    public String getServidorBD() {
        return infoLogin.getServidorBD();
    }

    /**
     * @return the usuarioBD
     */
    public String getUsuarioBD() {
        return infoLogin.getUsuarioBD();
    }

    /**
     * @return the passwordBD
     */
    public String getPasswordBD() {
        return this.desencriptar(infoLogin.getPasswordBD());
    }

    /**
     * @return the puerto
     */
    public String getPuerto() {
        return infoLogin.getPuerto();
    }

    /**
     * @return the guardarPasswd
     */
    public boolean isGuardarPasswd() {
        return infoLogin.isGuardarPasswd();
    }

	/**
     * @return the nombreBD
     */
    public String getNombreBD() {
        return infoLogin.getNombreBD();
    }

    /**
     * @param nombreBD the nombreBD to set
     */
    public void setNombreBD(String nombreBD) {
        this.infoLogin.setNombreBD(nombreBD);
    }

}//fin de ControladoraLogin
